package com.buaa.divinationmaster.core.database.dao;

import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Update;

import com.buaa.divinationmaster.core.database.entities.Hexagram;

import java.util.List;

/**
 * 六十四卦数据访问对象 (DAO)
 * 提供六十四卦数据的CRUD操作和查询功能，支持梅花易数和金钱卦
 */
@Dao
public interface HexagramDao {
    
    /**
     * 获取所有六十四卦，按ID排序
     * @return LiveData包装的六十四卦列表
     */
    @Query("SELECT * FROM hexagram_64 ORDER BY id")
    LiveData<List<Hexagram>> getAllHexagrams();
    
    /**
     * 获取所有六十四卦 (同步方法)
     * @return 六十四卦列表
     */
    @Query("SELECT * FROM hexagram_64 ORDER BY id")
    List<Hexagram> getAllHexagramsSync();
    
    /**
     * 根据ID获取特定卦象
     * @param hexagramId 卦象ID (1-64)
     * @return 卦象对象
     */
    @Query("SELECT * FROM hexagram_64 WHERE id = :hexagramId")
    Hexagram getHexagramById(int hexagramId);
    
    /**
     * 根据上下卦获取卦象
     * @param upper 上卦名称
     * @param lower 下卦名称
     * @return 卦象对象
     */
    @Query("SELECT * FROM hexagram_64 WHERE upper_trigram = :upper AND lower_trigram = :lower")
    Hexagram getHexagramByTrigrams(String upper, String lower);
    
    /**
     * 根据卦名获取卦象
     * @param name 卦名 (如：乾、坤、屯等)
     * @return 卦象对象
     */
    @Query("SELECT * FROM hexagram_64 WHERE name = :name")
    Hexagram getHexagramByName(String name);
    
    /**
     * 根据关键词搜索卦象
     * @param keyword 关键词
     * @return 匹配的卦象列表
     */
    @Query("SELECT * FROM hexagram_64 WHERE keywords LIKE '%' || :keyword || '%' ORDER BY id")
    List<Hexagram> searchByKeyword(String keyword);
    
    /**
     * 根据卦名或解释搜索卦象
     * @param searchQuery 搜索关键词
     * @return 匹配的卦象列表
     */
    @Query("SELECT * FROM hexagram_64 WHERE name LIKE '%' || :searchQuery || '%' OR interpretation LIKE '%' || :searchQuery || '%' OR meaning LIKE '%' || :searchQuery || '%' ORDER BY id")
    List<Hexagram> searchHexagrams(String searchQuery);
    
    /**
     * 根据五行属性获取卦象
     * @param element 五行属性 (金木水火土)
     * @return 特定五行的卦象列表
     */
    @Query("SELECT * FROM hexagram_64 WHERE element = :element ORDER BY id")
    List<Hexagram> getHexagramsByElement(String element);
    
    /**
     * 根据上卦获取所有相关卦象
     * @param upperTrigram 上卦名称
     * @return 包含指定上卦的所有卦象
     */
    @Query("SELECT * FROM hexagram_64 WHERE upper_trigram = :upperTrigram ORDER BY id")
    List<Hexagram> getHexagramsByUpperTrigram(String upperTrigram);
    
    /**
     * 根据下卦获取所有相关卦象
     * @param lowerTrigram 下卦名称
     * @return 包含指定下卦的所有卦象
     */
    @Query("SELECT * FROM hexagram_64 WHERE lower_trigram = :lowerTrigram ORDER BY id")
    List<Hexagram> getHexagramsByLowerTrigram(String lowerTrigram);
    
    /**
     * 获取指定范围内的卦象 (用于分页或特定卦组)
     * @param startId 开始ID
     * @param endId 结束ID
     * @return 指定范围的卦象列表
     */
    @Query("SELECT * FROM hexagram_64 WHERE id >= :startId AND id <= :endId ORDER BY id")
    List<Hexagram> getHexagramsByRange(int startId, int endId);
    
    /**
     * 获取随机卦象 (用于随机起卦)
     * @param limit 限制数量
     * @return 随机卦象列表
     */
    @Query("SELECT * FROM hexagram_64 ORDER BY RANDOM() LIMIT :limit")
    List<Hexagram> getRandomHexagrams(int limit);
    
    /**
     * 获取一个随机卦象
     * @return 随机卦象
     */
    @Query("SELECT * FROM hexagram_64 ORDER BY RANDOM() LIMIT 1")
    Hexagram getRandomHexagram();
    
    /**
     * 根据方位获取卦象
     * @param direction 方位
     * @return 特定方位的卦象列表
     */
    @Query("SELECT * FROM hexagram_64 WHERE direction = :direction ORDER BY id")
    List<Hexagram> getHexagramsByDirection(String direction);
    
    /**
     * 插入所有卦象 (批量插入，用于初始化数据)
     * @param hexagrams 卦象列表
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertAll(List<Hexagram> hexagrams);
    
    /**
     * 插入单个卦象
     * @param hexagram 卦象对象
     * @return 插入的行ID
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long insert(Hexagram hexagram);
    
    /**
     * 更新卦象信息
     * @param hexagram 卦象对象
     */
    @Update
    void update(Hexagram hexagram);
    
    /**
     * 删除卦象
     * @param hexagram 卦象对象
     */
    @Delete
    void delete(Hexagram hexagram);
    
    /**
     * 获取卦象总数
     * @return 总数 (应该是64)
     */
    @Query("SELECT COUNT(*) FROM hexagram_64")
    int getHexagramCount();
    
    /**
     * 检查卦象数据是否已初始化
     * @return 是否已初始化
     */
    @Query("SELECT COUNT(*) >= 64 FROM hexagram_64")
    boolean isDataInitialized();
    
    /**
     * 获取所有上卦的不重复列表
     * @return 上卦列表 (八卦)
     */
    @Query("SELECT DISTINCT upper_trigram FROM hexagram_64 ORDER BY upper_trigram")
    List<String> getAllUpperTrigrams();
    
    /**
     * 获取所有下卦的不重复列表
     * @return 下卦列表 (八卦)
     */
    @Query("SELECT DISTINCT lower_trigram FROM hexagram_64 ORDER BY lower_trigram")
    List<String> getAllLowerTrigrams();
    
    /**
     * 获取所有五行属性的不重复列表
     * @return 五行列表
     */
    @Query("SELECT DISTINCT element FROM hexagram_64 WHERE element IS NOT NULL AND element != '' ORDER BY element")
    List<String> getAllElements();
    
    /**
     * 清空所有卦象数据 (用于重新初始化)
     */
    @Query("DELETE FROM hexagram_64")
    void deleteAll();
}
